home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / xvisrc.zip / NORMAL.C < prev    next >
C/C++ Source or Header  |  1992-07-28  |  42KB  |  1,821 lines

  1. /* Copyright (c) 1990,1991,1992 Chris and John Downey */
  2. #ifndef lint
  3. static char *sccsid = "@(#)normal.c    2.7 (Chris & John Downey) 8/24/92";
  4. #endif
  5.  
  6. /***
  7.  
  8. * program name:
  9.     xvi
  10. * function:
  11.     PD version of UNIX "vi" editor, with extensions.
  12. * module name:
  13.     normal.c
  14. * module function:
  15.     Main routine for processing characters in command mode
  16.     as well as routines for handling the operators.
  17. * history:
  18.     STEVIE - ST Editor for VI Enthusiasts, Version 3.10
  19.     Originally by Tim Thompson (twitch!tjt)
  20.     Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
  21.     Heavily modified by Chris & John Downey
  22.  
  23. ***/
  24.  
  25. #include "xvi.h"
  26.  
  27. static    bool_t    do_target P((int, int));
  28. static    bool_t    do_cmd P((int, int));
  29. static    bool_t    do_badcmd P((int, int));
  30. static    bool_t    do_page P((int, int));
  31. static    bool_t    do_scroll P((int, int));
  32. static    bool_t    do_word P((int, int));
  33. static    bool_t    do_csearch P((int, int));
  34. static    bool_t    do_z P((int, int));
  35. static    bool_t    do_x P((int, int));
  36. static    bool_t    do_HLM P((int, int));
  37. static    bool_t    do_rchar P((int, int));
  38. static    bool_t    do_ins P((int, int));
  39. static    void    op_shift P((int, int, int, long, Posn *, Posn *));
  40. static    void    op_delete P((int, int, long, Posn *, Posn *));
  41. static    void    op_change P((int, int, long, Posn *, Posn *));
  42. static    void    op_yank P((Posn *, Posn *));
  43. static    bool_t    dojoin P((void));
  44.  
  45. /*
  46.  * Command type table. This is used for certain operations which are
  47.  * the same for "classes" of commands, e.g. for disallowing their use
  48.  * as targets of operators.
  49.  *
  50.  * Entries in this table having value 0 are unimplemented commands.
  51.  *
  52.  * If TARGET is set, the command may be used as the target for one of
  53.  * the operators (e.g. 'c'); the default is that targets are character-
  54.  * based unless TGT_LINE is set in which case they are line-based.
  55.  * Similarly, the default is that targets are exclusive, unless the
  56.  * TGT_INCLUSIVE flag is set.
  57.  *
  58.  * Q: WHAT DO WE DO ABOUT RETURN and LINEFEED???
  59.  * A: The ascii_map() macro (see ascii.h) handles this for QNX (I think).
  60.  */
  61. #define        COMMAND        0x1        /* is implemented */
  62. #define        TARGET        0x2        /* can serve as a target */
  63. #define        TGT_LINE    0x4        /* a line-based target */
  64. #define        TGT_CHAR    0        /* a char-based target */
  65. #define        TGT_INCLUSIVE    0x8        /* an inclusive target */
  66. #define        TGT_EXCLUSIVE    0        /* an exclusive target */
  67. #define        TWO_CHAR    0x10        /* a two-character command */
  68.  
  69. static    struct {
  70.     bool_t        (*c_func) P((int, int));
  71.     unsigned char    c_flags;
  72. } cmd_types[256] = {
  73.  /* ^@ */    do_badcmd,    0,
  74.  /* ^A */    do_badcmd,    0,
  75.  /* ^B */    do_page,    COMMAND,
  76.  /* ^C */    do_badcmd,    0,
  77.  /* ^D */    do_scroll,    COMMAND,
  78.  /* ^E */    do_scroll,    COMMAND,
  79.  /* ^F */    do_page,    COMMAND,
  80.  /* ^G */    do_cmd,        COMMAND,
  81.  /* ^H */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  82.  /* ^I */    do_badcmd,    0,
  83.  /* ^J */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  84.  /* ^K */    do_badcmd,    0,
  85.  /* ^L */    do_cmd,        COMMAND,
  86.  /* ^M */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  87.  /* ^N */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  88.  /* ^O */    do_cmd,        COMMAND,
  89.  /* ^P */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  90.  /* ^Q */    do_badcmd,    0,
  91.  /* ^R */    do_cmd,        COMMAND,
  92.  /* ^S */    do_badcmd,    0,
  93.  /* ^T */    do_cmd,        COMMAND,
  94.  /* ^U */    do_scroll,    COMMAND,
  95.  /* ^V */    do_badcmd,    0,
  96.  /* ^W */    do_cmd,        COMMAND,
  97.  /* ^X */    do_badcmd,    0,
  98.  /* ^Y */    do_scroll,    COMMAND,
  99.  /* ^Z */    do_cmd,        COMMAND,
  100.  /* ESCAPE */    do_cmd,        COMMAND,
  101.  /* ^\ */    do_badcmd,    0,
  102.  /* ^] */    do_cmd,        COMMAND,
  103.  /* ^^ */    do_cmd,        COMMAND,
  104.  /* ^_ */    do_rchar,    COMMAND,
  105.  /* space */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  106.  /* ! */    do_cmd,        COMMAND,
  107.  /* " */    do_cmd,        COMMAND | TWO_CHAR,
  108.  /* # */    do_badcmd,    0,
  109.  /* $ */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
  110.  /* % */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
  111.  /* & */    do_cmd,        COMMAND,
  112.  /* ' */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
  113.  /* ( */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  114.  /* ) */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  115.  /* * */    do_badcmd,    0,
  116.  /* + */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  117.  /* , */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  118.  /* - */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  119.  /* . */    do_cmd,        COMMAND,
  120.  /* / */    do_cmd,        COMMAND,
  121.  /* 0 */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  122.  /* 1 */    do_badcmd,    0,
  123.  /* 2 */    do_badcmd,    0,
  124.  /* 3 */    do_badcmd,    0,
  125.  /* 4 */    do_badcmd,    0,
  126.  /* 5 */    do_badcmd,    0,
  127.  /* 6 */    do_badcmd,    0,
  128.  /* 7 */    do_badcmd,    0,
  129.  /* 8 */    do_badcmd,    0,
  130.  /* 9 */    do_badcmd,    0,
  131.  /* : */    do_cmd,        COMMAND,
  132.  /* ; */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  133.  /* < */    do_cmd,        COMMAND,
  134.  /* = */    do_badcmd,    0,
  135.  /* > */    do_cmd,        COMMAND,
  136.  /* ? */    do_cmd,        COMMAND,
  137.  /* @ */    do_cmd,        COMMAND | TWO_CHAR,
  138.  /* A */    do_ins,        COMMAND,
  139.  /* B */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  140.  /* C */    do_cmd,        COMMAND,
  141.  /* D */    do_cmd,        COMMAND,
  142.  /* E */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
  143.  /* F */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
  144.  /* G */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  145.  /* H */    do_HLM,        COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  146.  /* I */    do_ins,        COMMAND,
  147.  /* J */    do_cmd,        COMMAND,
  148.  /* K */    do_badcmd,    0,
  149.  /* L */    do_HLM,        COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  150.  /* M */    do_HLM,        COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  151.  /* N */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  152.  /* O */    do_ins,        COMMAND,
  153.  /* P */    do_cmd,        COMMAND,
  154.  /* Q */    do_badcmd,    0,
  155.  /* R */    do_cmd,        COMMAND,
  156.  /* S */    do_cmd,        COMMAND,
  157.  /* T */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
  158.  /* U */    do_badcmd,    0,
  159.  /* V */    do_badcmd,    0,
  160.  /* W */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  161.  /* X */    do_x,        COMMAND,
  162.  /* Y */    do_cmd,        COMMAND,
  163.  /* Z */    do_cmd,        COMMAND | TWO_CHAR,
  164.  /* [ */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
  165.  /* \ */    do_badcmd,    0,
  166.  /* ] */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
  167.  /* ^ */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  168.  /* _ */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  169.  /* ` */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
  170.  /* a */    do_ins,        COMMAND,
  171.  /* b */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  172.  /* c */    do_cmd,        COMMAND,
  173.  /* d */    do_cmd,        COMMAND,
  174.  /* e */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
  175.  /* f */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE | TWO_CHAR,
  176.  /* g */    do_cmd,        COMMAND,
  177.  /* h */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  178.  /* i */    do_ins,        COMMAND,
  179.  /* j */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  180.  /* k */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  181.  /* l */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  182.  /* m */    do_cmd,        COMMAND | TWO_CHAR,
  183.  /* n */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  184.  /* o */    do_ins,        COMMAND,
  185.  /* p */    do_cmd,        COMMAND,
  186.  /* q */    do_badcmd,    0,
  187.  /* r */    do_cmd,        COMMAND,
  188.  /* s */    do_cmd,        COMMAND,
  189.  /* t */    do_csearch,    COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE | TWO_CHAR,
  190.  /* u */    do_cmd,        COMMAND,
  191.  /* v */    do_badcmd,    0,
  192.  /* w */    do_word,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  193.  /* x */    do_x,        COMMAND,
  194.  /* y */    do_cmd,        COMMAND,
  195.  /* z */    do_z,        COMMAND | TWO_CHAR,
  196.  /* { */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  197.  /* | */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  198.  /* } */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  199.  /* ~ */    do_rchar,    COMMAND,
  200.  /* DEL */    do_badcmd,    0,
  201.  /* K_HELP */    do_cmd,        COMMAND,
  202.  /* K_UNDO */    do_cmd,        COMMAND,
  203.  /* K_INSERT */    do_ins,        COMMAND,
  204.  /* K_HOME */    do_HLM,        COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  205.  /* K_UARROW */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  206.  /* K_DARROW */    do_target,    COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
  207.  /* K_LARROW */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  208.  /* K_RARROW */    do_target,    COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
  209.  /* K_CGRAVE */    do_cmd,        COMMAND,
  210. };
  211.  
  212. #define    NOP        '\0'        /* no pending o